/**
 * 物理层
 * 功能：
 *      发送数据：接收ch9121.js发来的数据，通过串口发送出去
 *      接收数据：串口收到数据，上传给ch9121.js
 */
var log = require("./nlog.js");
var uart = require('uart');
var conf = require("./settings.js")
var events = require("events");


/**
 * 参数uartPort: 指定串口端口号，"serial1"或"serial2"
 * 返回rtn: 串口实例，可以主动发数据，接收数据通过事件中断触发
 */
function Uart() {
    var rtn = {}
    rtn.event = new events();       // 通过事件将Uart接到的数据返回给调用串口的文件
    var setInfo = conf.GetParam()

    /* open uart1 or uart2 */
    var serial = uart.open({
        id: setInfo.Uart.uartPort,
        success: function () {
            log.d('open uart success')
        },
        fail: function () {
            log.d('open uart fail')
        }
    });


    /* 写字符串，参数是字符串 */
    rtn.WriteStr = function(msgStr) {
        // log.d(msgStr);
        var arrBuf = StrToDecArray(msgStr);
        serial.write(arrBuf);
    }


    /* 写数组，参数是数组 */
    rtn.WriteArr = function(arrBuf) {
        serial.write(arrBuf);
    }


    /* uart receive test */
    serial.on('data', function (data) {
        /* 这里不建议返回字符串，返回原始数据，是否转成字符串由接收数据的地方自己决定 */
        // var uartMsg = ArrayToString(data);
        // console.log(uartMsg);
        // rtn.event.emit("UART_RECV", uartMsg);
        rtn.event.emit("UART_RECV", data);
    });


    /* string convert to decimal array*/
    function StrToDecArray(str) {
        var obj = {
            '0': 48,
            '1': 49,
            '2': 50,
            '3': 51,
            '4': 52,
            '5': 53,
            '6': 54,
            '7': 55,
            '8': 56,
            '9': 57,
        }
        return str.split('').map(function (i) {
            if (obj[i]) {
                return obj[i]
            }
            return i.charCodeAt()
        })
    }


    /* array convert to  string */
    function ArrayToString(fileData) {
        var dataString = "";
        for (var i = 0; i < fileData.length; i++) {
            dataString += String.fromCharCode(fileData[i]);
        }
        return dataString;
    }

    return rtn;
}

module.exports = Uart;
